# -*- Mode: Python -*-
# vim: filetype=python
#

##
# ************
# Yank feature
# ************
##

##
# @YankInstanceType:
#
# An enumeration of yank instance types.  See `YankInstance` for more
# information.
#
# Since: 6.0
##
{ 'enum': 'YankInstanceType',
  'data': [ 'block-node', 'chardev', 'migration' ] }

##
# @YankInstanceBlockNode:
#
# Specifies which block graph node to yank.  See `YankInstance` for
# more information.
#
# @node-name: the name of the block graph node
#
# Since: 6.0
##
{ 'struct': 'YankInstanceBlockNode',
  'data': { 'node-name': 'str' } }

##
# @YankInstanceChardev:
#
# Specifies which character device to yank.  See `YankInstance` for
# more information.
#
# @id: the chardev's ID
#
# Since: 6.0
##
{ 'struct': 'YankInstanceChardev',
  'data': { 'id': 'str' } }

##
# @YankInstance:
#
# A yank instance can be yanked with the `yank` qmp command to recover
# from a hanging QEMU.
#
# @type: yank instance type
#
# Currently implemented yank instances:
#
# - nbd block device: Yanking it will shut down the connection to the
#   nbd server without attempting to reconnect.
# - socket chardev: Yanking it will shut down the connected socket.
# - migration: Yanking it will shut down all migration connections.
#   Unlike `migrate_cancel`, it will not notify the migration process,
#   so migration will go into @failed state, instead of @cancelled
#   state.  `yank` should be used to recover from hangs.
#
# Since: 6.0
##
{ 'union': 'YankInstance',
  'base': { 'type': 'YankInstanceType' },
  'discriminator': 'type',
  'data': {
      'block-node': 'YankInstanceBlockNode',
      'chardev': 'YankInstanceChardev' } }

##
# @yank:
#
# Try to recover from hanging QEMU by yanking the specified instances.
# See `YankInstance` for more information.
#
# @instances: the instances to be yanked
#
# Errors:
#     - If any of the YankInstances doesn't exist, DeviceNotFound
#
# .. qmp-example::
#
#     -> { "execute": "yank",
#          "arguments": {
#              "instances": [
#                   { "type": "block-node",
#                     "node-name": "nbd0" }
#              ] } }
#     <- { "return": {} }
#
# Since: 6.0
##
{ 'command': 'yank',
  'data': { 'instances': ['YankInstance'] },
  'allow-oob': true }

##
# @query-yank:
#
# Query yank instances.  See `YankInstance` for more information.
#
# TODO: This line is a hack to separate the example from the body
#
# .. qmp-example::
#
#     -> { "execute": "query-yank" }
#     <- { "return": [
#              { "type": "block-node",
#                "node-name": "nbd0" }
#          ] }
#
# Since: 6.0
##
{ 'command': 'query-yank',
  'returns': ['YankInstance'],
  'allow-oob': true }
